#include "serialport.h"
#include <QDebug>
#include <QTextCodec>

serialport::serialport(QObject *parent) : QObject(parent)
{
     m_serialPort = new QSerialPort();
     isOpen = 0;
}

void serialport::RecvPortMsg()
{
    static QByteArray msg;

    msg += m_serialPort->readAll();

    qDebug() << msg;

    if (msg.isEmpty()) return;
    /* 找协议头 */

    int headIndex = msg.indexOf('$');
    if (headIndex != -1)
    {
        char tail = msg.at(headIndex+2);
        if (tail == ';')
        {
            char cmd = msg.at(headIndex+1);
            if (cmd == 'S')
            {
                qDebug() << "开始定时";
                emit start_timing();
            }
            else if (cmd == 'P')
            {
                qDebug() << "停止定时";
                emit stop_timing();
            }
            msg.remove(headIndex, 3);    /* 处理完把协议删除 */
        }
    }

    if (msg.length() >= 10000)
        msg.clear();
//    emit getSerialPortMsg(byteMsg);
}

void serialport::serialPortInit(QString name, QString baudrate)
{
    if (m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了
    {
        m_serialPort->clear();
        m_serialPort->close();
        isOpen = 0;
    }

    //设置串口名字 假设我们上面已经成功获取到了 并且使用第一个
    m_serialPort->setPortName(name);

    if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
    {
        isOpen = 0;
        qDebug() << name << "打开失败!";
        return;
    }
    //打开成功
    isOpen = 1;

    m_serialPort->setBaudRate(QSerialPort::Baud115200, QSerialPort::AllDirections);//设置波特率和读写方向
    m_serialPort->setDataBits(QSerialPort::Data8);		//数据位为8位
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
    m_serialPort->setParity(QSerialPort::NoParity);	//无校验位
    m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位

    //连接信号槽 当下位机发送数据QSerialPortInfo 会发送个 readyRead 信号,我们定义个槽void receiveInfo()解析数据
    connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(RecvPortMsg()));
}

/* 获取当前所有可用串口 */
QStringList serialport::getVaildSerialPortName()
{
    QStringList serialPortName;
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        serialPortName << info.portName();
        qDebug()<< "serialPortName:" << info.portName();
    }
    return serialPortName;
}

/* 发送数据 */
void serialport::serialWriteData(const char *data)
{
    m_serialPort->write(data, strlen(data));
}

/* 关闭串口 */
void serialport::serialClose()
{
    isOpen = 0;
    m_serialPort->close();
}

void serialport::setSerialPortNameAndBaudrate(QString name, QString baud)
{
    m_serialPort->setPortName(name);
    m_serialPort->setBaudRate(QSerialPort::Baud115200, QSerialPort::AllDirections);//设置波特率和读写方向
}


char serialport::isSerialOpen()
{
    return isOpen;
}
